package testes;

import static org.junit.Assert.*;

import java.util.HashSet;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.quasar.copaPaises.businessLayer.CalendarDate;
import org.quasar.copaPaises.businessLayer.Campeonato;
import org.quasar.copaPaises.businessLayer.Cartao;
import org.quasar.copaPaises.businessLayer.Cidade;
import org.quasar.copaPaises.businessLayer.Clube;
import org.quasar.copaPaises.businessLayer.Continente;
import org.quasar.copaPaises.businessLayer.Equipa;
import org.quasar.copaPaises.businessLayer.Estadio;
import org.quasar.copaPaises.businessLayer.Golo;
import org.quasar.copaPaises.businessLayer.Grupo;
import org.quasar.copaPaises.businessLayer.Jogador;
import org.quasar.copaPaises.businessLayer.Jogo;
import org.quasar.copaPaises.businessLayer.Membro;
import org.quasar.copaPaises.businessLayer.Pais;
import org.quasar.copaPaises.businessLayer.Participacao;
import org.quasar.copaPaises.businessLayer.Participante;
import org.quasar.copaPaises.businessLayer.PosicaoJogador;
import org.quasar.copaPaises.businessLayer.Treinador;

public class ParticipacaoTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}

	@Before
	public void setUp() throws Exception {
		 CalendarDate.allInstances.clear();
		  Campeonato.allInstances.clear();
		  Cartao.allInstances.clear();
		  Cidade.allInstances.clear();
		  Clube.allInstances.clear();
		  Continente.allInstances.clear();
		  Equipa.allInstances.clear();
		  Estadio.allInstances.clear();
		  Golo.allInstances.clear();
		  Grupo.allInstances.clear();
		  Jogador.allInstances.clear();
		  Jogo.allInstances.clear();
		  Membro.allInstances.clear();
		  Pais.allInstances.clear();
		  Participacao.allInstances.clear();
		  Participante.allInstances().clear();
		  Treinador.allInstances.clear();
	}

	@After
	public void tearDown() throws Exception {
		 CalendarDate.allInstances.clear();
		  Campeonato.allInstances.clear();
		  Cartao.allInstances.clear();
		  Cidade.allInstances.clear();
		  Clube.allInstances.clear();
		  Continente.allInstances.clear();
		  Equipa.allInstances.clear();
		  Estadio.allInstances.clear();
		  Golo.allInstances.clear();
		  Grupo.allInstances.clear();
		  Jogador.allInstances.clear();
		  Jogo.allInstances.clear();
		  Membro.allInstances.clear();
		  Pais.allInstances.clear();
		  Participacao.allInstances.clear();
		  Participante.allInstances().clear();
		  Treinador.allInstances.clear();
	}

	@Test
	public final void testParticipacao() {
		Participacao participacao = new Participacao();
		assertNotNull(participacao);
	}

	@Test
	public final void testParticipacaoIntBooleanCampeonatoPaisSetOfJogadorTreinador() {
		int classificacao = 3;
		boolean organizacao = false;
		Campeonato campeonato = new Campeonato();
		Pais pais = new Pais();
		HashSet<Jogador> plantel = new HashSet<Jogador>();
		Treinador treinador = new Treinador();
		Participacao participacao = new Participacao(classificacao,organizacao,campeonato,pais,plantel,treinador);
		assertNotNull(participacao);
		assertEquals(participacao.classificacao(), classificacao);
		assertEquals(participacao.organizador(),organizacao);
		assertEquals(participacao.participado(),campeonato);
		assertEquals(participacao.participante(),pais);
		assertEquals(participacao.plantel(),plantel);
		assertEquals(participacao.treinador(),treinador);

	}

	@Test
	public final void testClassificacao() {
		int classificacao = 3;
		Participacao participacao = new Participacao(classificacao,false,null,null,null,null);
		assertNotNull(participacao.classificacao());
		assertEquals(participacao.classificacao(),classificacao);
	}

	@Test
	public final void testSetClassificacao() {
		int classificacao = 3;
		Participacao participacao = new Participacao();
		participacao.setClassificacao(classificacao);
		assertNotNull(participacao.classificacao());
		assertEquals(participacao.classificacao(),classificacao);
	}

	@Test
	public final void testOrganizador() {
		boolean organizacao1 = false;
		boolean organizacao2 = true;
		Participacao participacao1 = new Participacao(3,organizacao1,null,null,null,null);
		Participacao participacao2 = new Participacao(3,organizacao2,null,null,null,null);
		assertNotNull(participacao1.organizador());
		assertNotNull(participacao2.organizador());
		assertFalse (participacao1.organizador());
		assertTrue (participacao2.organizador());
		
	}

	@Test
	public final void testSetOrganizador() {
		boolean organizacao1 = false;
		boolean organizacao2 = true;
		Participacao participacao1 = new Participacao();
		Participacao participacao2 = new Participacao();
		participacao1.setOrganizador(organizacao1);
		participacao2.setOrganizador(organizacao2);
		assertNotNull(participacao1.organizador());
		assertNotNull(participacao2.organizador());
		assertFalse (participacao1.organizador());
		assertTrue (participacao2.organizador());
	}

	@Test
	public final void testParticipado() {
		Campeonato campeonato = new Campeonato();
		Participacao participacao = new Participacao(3,false,campeonato,null,null,null);
		assertNotNull(participacao.participado());
		assertEquals(participacao.participado(),campeonato);

	}

	@Test
	public final void testSetParticipado() {
		Campeonato campeonato = new Campeonato();
		Participacao participacao = new Participacao();
		participacao.setParticipado(campeonato);
		assertNotNull(participacao.participado());
		assertEquals(participacao.participado(),campeonato);
	}

	@Test
	public final void testParticipante() {
		Pais pais = new Pais();
		Participacao participacao = new Participacao(3,false,null,pais,null,null);
		assertNotNull(participacao.participante());
		assertEquals(participacao.participante(),pais);
	}

	@Test
	public final void testSetParticipante() {
		Pais pais = new Pais();
		Participacao participacao = new Participacao();
		participacao.setParticipante(pais);
		assertNotNull(participacao.participante());
		assertEquals(participacao.participante(),pais);
	}

	@Test
	public final void testPlantel() {
		HashSet<Jogador> plantel = new HashSet<Jogador>();
		Jogador j1 = new Jogador();
		Jogador j2 = new Jogador();
		Jogador j3 = new Jogador();
		j3.setNome("Luis");
		plantel.add(j1);
		plantel.add(j2);
		Participacao participacao = new Participacao(3,false,null,null,plantel,null);
		assertNotNull(participacao.plantel());
		assertEquals(participacao.plantel(),plantel);
		assertTrue(participacao.plantel().size()==2);
		
	}

	@Test
	public final void testSetPlantel() {
		HashSet<Jogador> plantel = new HashSet<Jogador>();
		Jogador j1 = new Jogador();
		Jogador j2 = new Jogador();
		Jogador j3 = new Jogador();
		plantel.add(j1);
		plantel.add(j2);
		j3.setNome("Luis");
		Participacao participacao = new Participacao();
		participacao.setPlantel(plantel);
		assertNotNull(participacao.plantel());
		assertEquals(participacao.plantel(),plantel);
		assertTrue(participacao.plantel().size()==2);
	}

	@Test
	public final void testTreinador() {
		Treinador treinador = new Treinador();
		Participacao participacao = new Participacao(3,false,null,null,null,treinador);
		assertNotNull(participacao.treinador());
		assertEquals(participacao.treinador(),treinador);
	}

	@Test
	public final void testSetTreinador() {
		Treinador treinador = new Treinador();
		Participacao participacao = new Participacao();
		participacao.setTreinador(treinador);
		assertNotNull(participacao.treinador());
		assertEquals(participacao.treinador(),treinador);
	}

	@Test
	public final void testAdicionaJogador() {
		Participacao participacao = new Participacao();
		Participacao participacao2 = new Participacao();
		
		Pais p = new Pais();
		Clube c1 = new Clube();
		c1.setNome("Benfica");
		Clube c2 = new Clube();
		c2.setNome("Sporting");
		participacao.adicionaJogador("joao", "1984-01-01", PosicaoJogador.Avancado, p, "Benfica", p);
		participacao2.adicionaJogador("canario","1986-12-23",PosicaoJogador.Defesa,p,"Porto",p);
		assertTrue(participacao.plantel().size() == 1);
		assertTrue(participacao2.plantel().size()==1);
	}

	@Test
	public final void testOrganiza() {
		Participacao participacao1 = new Participacao(3,true,null,null,null,null);
		Participacao participacao2 = new Participacao(3,false,null,null,null,null);
		participacao1.organiza();
		participacao2.organiza();
		assertTrue(participacao1.organizador());
		assertTrue(participacao2.organizador());
	}

	@Test
	public final void testToString() {
		Participacao participacao = new Participacao(3,true,new Campeonato(),new Pais(),new HashSet<Jogador>(),new Treinador());		
		String toString = "Participacao [classificacao=3, organizador=true, participado=Campeonato [genero=null, nome=null, numPaises=0]\n" +
				", participante=Pais [area=0, nome=null, populacao=0, continente=null, grupo=null]\n" +
				", plantel=[], treinador=Treinador []\n]\n";
		assertEquals(participacao.toString(),toString);
	}

}
